package com.ruoyi.common.core.utils;

import cn.hutool.core.util.StrUtil;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

/**
 * 时间工具类
 *
 * @author ruoyi
 */
public class LocalDateUtils {

  private static final String DEFAULT_DATE_STRING = "0001-01-01";
  private static final DateTimeFormatter defaultTimeFormat = DateTimeFormatter.ofPattern(
      "yyyy-MM-dd HH:mm:ss");
  private static final DateTimeFormatter defaultDateFormat = DateTimeFormatter.ofPattern(
      "yyyy-MM-dd");


  /**
   * 时间转字符串，支持自定义格式，默认“yyyy-MM-dd HH:mm:ss”
   *
   * @param dateTime 时间
   * @return 转换后结果
   */
  public static String dateTimeFormatNullForBlank(LocalDateTime dateTime) {
    if (dateTime == null) {
      return "";
    }
    return dateTimeFormat(dateTime, null);
  }

  /**
   * 时间转字符串，支持自定义格式，默认“yyyy-MM-dd HH:mm:ss”
   *
   * @param dateTime 时间
   * @return 转换后结果
   */
  public static String dateTimeFormat(LocalDateTime dateTime) {
    if (dateTime == null) {
      return null;
    }
    return dateTimeFormat(dateTime, null);
  }

  /**
   * 时间转字符串，支持自定义格式，默认“yyyy-MM-dd HH:mm:ss”
   *
   * @param dateTime 时间
   * @param pattern  格式
   * @return 转换后结果
   */
  public static String dateTimeFormat(LocalDateTime dateTime, String pattern) {
    if (dateTime == null) {
      return null;
    }
    return pattern == null ? defaultTimeFormat.format(dateTime)
        : DateTimeFormatter.ofPattern(pattern)
            .format(dateTime);
  }

  /**
   * 时间日期转字符串，格式"yyyy-MM-dd HH:mm:ss"
   *
   * @param dataTime 时间
   * @return 转换结果
   */
  public static LocalDateTime parseToLocalDateTime(String dataTime) {
    if (StrUtil.isBlank(dataTime)) {
      return null;
    }
    return LocalDateTime.parse(dataTime, defaultTimeFormat);
  }


  /**
   * 字符串转换成日期
   *
   * @param dataTime 日期字符串
   * @return LocalDate对象
   */
  public static LocalDate parseToLocalDate(String dataTime) {
    return parseToLocalDate(dataTime, null);
  }

  /**
   * 字符串转换成日期
   *
   * @param dataTime 日期字符串
   * @return LocalDate对象
   */
  public static LocalDate parseToLocalDate(String dataTime, String pattern) {
    if (StrUtil.isBlank(dataTime)) {
      return null;
    }
    return LocalDate.parse(dataTime, pattern == null ? defaultDateFormat
        : DateTimeFormatter.ofPattern(pattern));
  }

  /**
   * 字符串转换成日期开始时间
   */
  public static LocalDateTime beginOfDate(String dateStr) {
    return parseToLocalDateTime(StrUtil.format("{} 00:00:00", dateStr));
  }

  /**
   * 字符串转换成日期开始时间
   */
  public static LocalDateTime beginOfDate(LocalDate localdate) {
    return localdate.atStartOfDay();
  }

  /**
   * 字符串转换成日期开始时间
   */
  public static LocalDateTime beginOfDate(LocalDateTime localDateTime) {
    return beginOfDate(localDateTime.toLocalDate());
  }

  /**
   * 字符串转换成日期结束时间
   */
  public static LocalDateTime endOfDate(String dateStr) {
    return parseToLocalDateTime(StrUtil.format("{} 23:59:59", dateStr));
  }

  /**
   * 字符串转换成日期开始时间
   */
  public static LocalDateTime endOfDate(LocalDate localdate) {
    return localdate.atTime(LocalTime.MAX);
  }

  /**
   * 字符串转换成日期开始时间
   */
  public static LocalDateTime endOfDate(LocalDateTime localDateTime) {
    return endOfDate(localDateTime.toLocalDate());
  }

  /**
   * 日期字符串转换成时间(默认补充当前时间)
   */
  public static LocalDateTime fillDateWithNowTime(String dateStr) {
    return parseToLocalDateTime(StrUtil.format("{} {}", dateStr,
        LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"))));
  }

  /**
   * 日期字符串转换成时间(默认补充当前时间)
   */
  public static LocalDateTime fillDateWithNowTime(LocalDate date) {
    return LocalDateTime.of(date, LocalTime.now());
  }

  /**
   * 日期字符串转换成时间(不中指定时间)
   */
  public static LocalDateTime fillDateWithTime(LocalDate date, LocalTime time) {
    return LocalDateTime.of(date, time);
  }


  /**
   * 日期类型数据格式化
   *
   * @param date 需要转换的日期
   * @return 格式化后字符串
   */
  public static String localDateFormat(LocalDate date) {
    if (date == null || date.isEqual(LocalDate.parse(DEFAULT_DATE_STRING))) {
      return null;
    }
    return localDateFormat(date, null);
  }

  /**
   * 日期类型数据格式化
   *
   * @param date    需要转换的日期
   * @param pattern 转换格式
   * @return 格式化后字符串
   */
  public static String localDateFormat(LocalDate date, String pattern) {
    if (date == null) {
      return null;
    }
    return pattern == null ? defaultDateFormat.format(date)
        : DateTimeFormatter.ofPattern(pattern)
            .format(date);
  }

  /**
   * 获取当前时间所在月份的开始时间 00:00:00
   */
  public static LocalDateTime beginCurrentMonth() {
    return LocalDateTime.now().with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
  }

  /**
   * 获取当前时间所在月份的开始时间 00:00:00
   *
   * @param now 当前时间
   */
  public static LocalDateTime beginOfMonth(LocalDateTime now) {
    return now.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
  }

  /**
   * 获取当前时间所在月份的结束时间 23:59:59
   */
  public static LocalDateTime endCurrentMonth() {
    return LocalDateTime.now().with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
  }

  /**
   * 获取当前时间所在月份的结束时间 23:59:59
   *
   * @param now 当前时间
   */
  public static LocalDateTime endOfMonth(LocalDateTime now) {
    return now.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
  }

  /**
   * 获取两个时间中的最小时间
   *
   * @param dateTime1 时间1
   * @param dateTime2 时间2
   * @return 最小时间
   */
  public static LocalDateTime minDateTime(LocalDateTime dateTime1, LocalDateTime dateTime2) {
    return dateTime1.isBefore(dateTime2) ? dateTime1 : dateTime2;
  }

  /**
   * 获取两个时间中的最大时间
   *
   * @param dateTime1 时间1
   * @param dateTime2 时间2
   * @return 最大时间
   */
  public static LocalDateTime maxDateTime(LocalDateTime dateTime1, LocalDateTime dateTime2) {
    return dateTime1.isAfter(dateTime2) ? dateTime1 : dateTime2;
  }
}
